package org.example;

/**
 * ClassName: study
 * Package: org.example
 * Description:
 *
 * @Author liu
 * @Create 2025/5/17 20:04
 * @ Version 1.0
 */
public class study {
    //本程序实行三层架构：
    /*分为：数据访问层，Dao层：用于数据的增，删，改，查的操作
           业务逻辑层，Service层：负责业务逻辑处理的代码
           请求处理，响应数据，Controller层：负责，接受页面的请求，并给页面响应数据
     */
    //分成解耦
    /*
    因为在程序中，需要什么对象，就直接new一个对象new UserSerivceImpl(),
    但当我们需要更换实现类时，就需要修改代码，这就是程序的耦合度高
    所以需要解耦合，将对象交给容器管理，
    这样，当需要更换实现类时，只需修改接口的实现类，而不需要修改代码

    所以我们引入spring的二个核心概念：
    1.IOC：控制反转，将创建对象的过程交给spring容器管理
           导入：@Component注释
           声明bean分为：@Controller(控制类),
                       @Service(业务类),
                       @Repository(数据访问类)
           但在声明控制器bean只能用@Controller注释
    2.DI：依赖注入，容器为应用程序提供运行时，所依赖的资源，称之为依赖注入。
           导入：@Autowired注释
               用法: 1.属性注入
                        private UserSerivce userSerivce;
                    2.构造函数注入：(官方推荐)
                       private UserSerivce userSerivce;
                       @Autowired(只有一个构造函数时，可省略)
                       public UserController(UserSerivce userSerivce){
                       this.userSerivce = userSerivce;
                       }
                    3.setter方法注入：(不推荐)
                       private UserSerivce userSerivce;
                       @Autowired
                       public void setUserSerivce(UserSerivce userSerivce){
                           this.userSerivce = userSerivce;
                       }
    3.bean：对象， ioc容器中创建，管理的对象

   注意：在ioc容器中，存在多个相同类型的bean时：
        可以用@Primary注解，让ioc容器中，只存在一个bean
        也可以用@Qualifier("beanName")注解，指定bean的名字,必须与@Autowired注解配合
        也可以用@Resource(name="beanName")注解，指定bean的名字
     */
}
